home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
asm_msc1.arc
/
EX41.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-11-20
|
2KB
|
66 lines
TITLE 32-Bit x 32-Bit Unsigned Multiply (EX41.ASM)
PAGE ,132
EX41_DATA SEGMENT PARA 'DATA'
HI_MCND DW ?
LO_MCND DW ?
HI_PP1 DW ?
LO_PP1 DW ?
HI_PP2 DW ?
LO_PP2 DW ?
HI_PP3 DW ?
LO_PP3 DW ?
HI_PP4 DW ?
LO_PP4 DW ?
EX41_DATA ENDS
EX41_CODE SEGMENT PARA 'CODE'
PUBLIC MULU32
MULU32 PROC FAR
ASSUME CS:EX41_CODE,DS:EX41_DATA
;
; Initialize the data segment address.
;
PUSH DS ;Save caller's DS and Di
PUSH DI
MOV DI,EX41_DATA ;Initialize DS
MOV DS,DI
;
; The main program follows.
;
MOV HI_MCND,DX ;Save multiplicand in memory
MOV LO_MCND,AX
MUL BX ;Form partial product #1
MOV HI_PP1,DX ; and save it in memory
MOV LO_PP1,AX
MOV AX,HI_MCND ;Form partial product #2
MUL BX
MOV HI_PP2,DX ; and save it in memory
MOV LO_PP2,AX
MOV AX,LO_MCND ;Form partial product #3
MUL CX
MOV HI_PP3,DX ; and save it in memory
MOV LO_PP3,AX
MOV AX,HI_MCND ;Form partial product #4
MUL CX
MOV HI_PP4,DX ; and save it in memory
MOV LO_PP4,AX
;
; Add the partial products to form the final 64-bit product.
;
MOV AX,LO_PP1 ;Low 16 bits
MOV BX,HI_PP1 ;Form mid-lower 16 bits
ADD BX,LO_PP2 ; with sum #1
ADC HI_PP2,0
ADD BX,LO_PP3 ; and sum #2
MOV CX,HI_PP2 ;Form mid-upper 16 bits
ADC CX,HI_PP3 ; with sum #3
ADC HI_PP4,0
ADD CX,LO_PP4 ; and sum #4
MOV DX,HI_PP4 ;Form high 16 bits
ADC DX,0 ; including propagated carry
POP DI ;Restore caller's registers
POP DS
RET
MULU32 ENDP
EX41_CODE ENDS
END MULU32